package com.insight.repository;

import com.insight.common.enums.CollectionType;
import com.insight.common.enums.TaskStatus;
import com.insight.entity.CollectionTask;
import com.insight.entity.DataSource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * T043: CollectionTask Repository接口
 * 采集任务数据访问层，使用Spring Data JPA
 *
 * @author Insight Team
 */
@Repository
public interface CollectionTaskRepository extends JpaRepository<CollectionTask, Long> {

    /**
     * 根据数据源查找所有采集任务
     *
     * @param dataSource 数据源
     * @return 采集任务列表
     */
    List<CollectionTask> findByDataSource(DataSource dataSource);

    /**
     * 根据数据源ID查找所有采集任务
     *
     * @param dataSourceId 数据源ID
     * @return 采集任务列表
     */
    @Query("SELECT ct FROM CollectionTask ct WHERE ct.dataSource.id = :dataSourceId")
    List<CollectionTask> findByDataSourceId(@Param("dataSourceId") Long dataSourceId);

    /**
     * 根据状态查找采集任务
     *
     * @param status 任务状态
     * @return 采集任务列表
     */
    List<CollectionTask> findByStatus(TaskStatus status);

    /**
     * 根据采集类型查找采集任务
     *
     * @param collectionType 采集类型
     * @return 采集任务列表
     */
    List<CollectionTask> findByCollectionType(CollectionType collectionType);

    /**
     * 根据数据源和状态查找采集任务
     *
     * @param dataSource 数据源
     * @param status     任务状态
     * @return 采集任务列表
     */
    List<CollectionTask> findByDataSourceAndStatus(DataSource dataSource, TaskStatus status);

    /**
     * 根据数据源ID和状态查找采集任务
     *
     * @param dataSourceId 数据源ID
     * @param status       任务状态
     * @return 采集任务列表
     */
    @Query("SELECT ct FROM CollectionTask ct WHERE ct.dataSource.id = :dataSourceId AND ct.status = :status")
    List<CollectionTask> findByDataSourceIdAndStatus(@Param("dataSourceId") Long dataSourceId, @Param("status") TaskStatus status);

    /**
     * 查找指定数据源的最新采集任务
     *
     * @param dataSource 数据源
     * @return 最新采集任务Optional
     */
    Optional<CollectionTask> findFirstByDataSourceOrderByCreatedAtDesc(DataSource dataSource);

    /**
     * 查找指定数据源ID的最新采集任务
     *
     * @param dataSourceId 数据源ID
     * @return 最新采集任务Optional
     */
    @Query("SELECT ct FROM CollectionTask ct WHERE ct.dataSource.id = :dataSourceId ORDER BY ct.createdAt DESC LIMIT 1")
    Optional<CollectionTask> findLatestByDataSourceId(@Param("dataSourceId") Long dataSourceId);

    /**
     * 查找指定数据源的最新成功采集任务
     *
     * @param dataSource 数据源
     * @return 最新成功采集任务Optional
     */
    Optional<CollectionTask> findFirstByDataSourceAndStatusOrderByCreatedAtDesc(DataSource dataSource, TaskStatus status);

    /**
     * 分页查询指定数据源的采集任务
     *
     * @param dataSource 数据源
     * @param pageable   分页参数
     * @return 采集任务分页结果
     */
    Page<CollectionTask> findByDataSource(DataSource dataSource, Pageable pageable);

    /**
     * 分页查询指定数据源ID的采集任务
     *
     * @param dataSourceId 数据源ID
     * @param pageable     分页参数
     * @return 采集任务分页结果
     */
    @Query("SELECT ct FROM CollectionTask ct WHERE ct.dataSource.id = :dataSourceId")
    Page<CollectionTask> findByDataSourceId(@Param("dataSourceId") Long dataSourceId, Pageable pageable);

    /**
     * 分页查询指定状态的采集任务
     *
     * @param status   任务状态
     * @param pageable 分页参数
     * @return 采集任务分页结果
     */
    Page<CollectionTask> findByStatus(TaskStatus status, Pageable pageable);

    /**
     * 分页查询指定类型的采集任务
     *
     * @param collectionType 采集类型
     * @param pageable       分页参数
     * @return 采集任务分页结果
     */
    Page<CollectionTask> findByCollectionType(CollectionType collectionType, Pageable pageable);

    /**
     * 查找指定时间范围内创建的采集任务
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 采集任务列表
     */
    List<CollectionTask> findByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查找正在运行的采集任务数量
     *
     * @return 运行中的任务数量
     */
    long countByStatus(TaskStatus status);

    /**
     * 查找指定数据源的正在运行的采集任务数量
     *
     * @param dataSource 数据源
     * @param status     任务状态
     * @return 任务数量
     */
    long countByDataSourceAndStatus(DataSource dataSource, TaskStatus status);

    /**
     * 删除指定数据源的所有采集任务
     *
     * @param dataSource 数据源
     */
    void deleteByDataSource(DataSource dataSource);

    /**
     * 删除指定数据源ID的所有采集任务
     *
     * @param dataSourceId 数据源ID
     */
    @Modifying
    @Transactional
    @Query("DELETE FROM CollectionTask ct WHERE ct.dataSource.id = :dataSourceId")
    void deleteByDataSourceId(@Param("dataSourceId") Long dataSourceId);
}
